#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<sys/types.h>

int main()
{
    printf("testexec begin...\n");

    pid_t id = fork();
    if(id == 0)
    {
        //child:
        printf("I am child, pid: %d\n", getpid());
        //1.l,v系列函数使用：
        //execl("ls", "ls", "-a", "-l", "--color", NULL);
        //char* const argv[] = {
        //  (char*)"ls", 
        //  (char*)"-a", 
        //  (char*)"-l", 
        //  (char*)"--color",
        //  NULL
        //};
        //execv("/usr/bin/ls", argv);
        //2.p系列函数使用：需要你的可执行程序路径存在于PATH中
        //execlp("python3", "python3", "test.py", NULL);
        //char* const argv[] = {
        //  (char*)"ls", 
        //  (char*)"-a", 
        //  (char*)"-l", 
        //  (char*)"--color",
        //  NULL
        //};
        //execvp("ls", argv);
        //char* const argv[] = {
        //  (char*)"mycplusplus.exe", 
        //  NULL
        //};
        //execvp("mycplusplus.exe", argv);
        //3.e系列函数使用：
        char* const argv[] = {
          (char*)"mycplusplus.exe",
          NULL
        };
        //可以自定义环境变量交给子进程：
        char* const env[] = {
          (char*)"HELLO=520",
          (char*)"LINUX=1314",
          NULL
        };
        //可以用系统自带的环境变量：
        extern char** environ;
        execvpe("./mycplusplus.exe", argv, environ);
        
        exit(1);
    }
    //father:
    int status = 0;
    pid_t wid = waitpid(id, &status, 0);
    if(wid > 0)
    {
        if(WIFEXITED(status))
        {
            printf("child normally quit...exit_code: %d\n",WEXITSTATUS(status));
        }
        else
        {
            printf("child abnormally quit...exit_signal: %d\n",status & 0x7f);
        }
    }
    else 
    {
        printf("wait failed...\n");
    }
    printf("testexec end...\n");
    return 0;
}
